#ifndef EXCELENGINE_H
#define EXCELENGINE_H

#include <QObject>
#include <QtXlsx>
#include <QTableWidget>

//有关EXCEL操作，不需要安装excel便可操作,但不支持*.xls文件，可以将*.xls用office/wps打开后,另存为*.xlsx格式
// 不能直接修改后缀名

class ExcelEngine : public QObject
{
    Q_OBJECT

public:
    explicit ExcelEngine(QObject *parent = nullptr);
    explicit ExcelEngine(QString xlsFile, QObject *parent = nullptr);
    ~ExcelEngine();
public:
    bool Open(uint nSheet = 1,bool visible = false);          //打开xlsx文件
    bool Open(QString xlsFile,uint nSheet = 1,bool visible = false);
    bool OpenSheet(QString xlsFile, QString sheetName, QIODevice::OpenModeFlag flags = QIODevice::ReadOnly);          //打开xlsx文件
    //当该文档是新建出来的时可以设置它的表头j
    void SetSheetHead(QList<QString> heads);
    void SetSheetHead(QList<QString> heads, QString sheetName);
    bool Save();                                              //保存xls报表
    void Close();                                             //关闭xls报表
    bool SaveDataFrTable(QTableWidget* tableWidget);          //保存数据到xls
    bool ReadDataToTable(QTableWidget* tableWidget);          //从xls读取数据到ui
    QList<QList<QVariant>>  getAllData();//将xls文件的数据转化成二维数组
    bool setAllData(QList<QList<QVariant>> data, bool isEnable, int row = 0, int col = 0);

    QVariant GetCellData(uint row,uint column);               //获取指定单元数据
    bool SetCellData(uint row,uint column,QVariant data); //修改指定单元数据
    bool SetCellData(uint row,uint column,QVariant data,QString sheetName); //修改指定单元数据
    bool clearSheet();
    uint GetRowCount()const;								  //获取行数
    uint GetRowCount(QString sheetName)const;								  //获取行数
    uint GetColumnCount()const;								  //获取列数
    uint GetColumnCount(QString sheetName)const;								  //获取行数
    bool IsOpen();											  //检验
    bool IsValid();											  //检验
    bool IsANewFile();
protected:
    void Clear();
private:
    QXlsx::Document *pExcel = NULL;       //指向整个excel应用程序
    QXlsx::Worksheet *pWorksheet = NULL;   //指向工作簿中的某个sheet表单
    QString   sXlsFile;      //xls文件路径
    uint      nCurrSheet;    //当前打开的第几个sheet
    int       nRowCount;     //行数
    int       nColumnCount;  //列数
    int       nStartRow;     //开始有数据的行下标值
    int       nStartColumn;  //开始有数据的列下标值
    bool      bIsOpen;       //是否已打开
    bool      bIsValid;      //是否有效
    bool      bIsANewFile;   //是否是一个新建xls文件，用来区分打开的excel是已存在文件还是有本类新建的
    bool      bIsSaveAlready;//防止重复保存
};
#endif // EXCELENGINE_H
